package control;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author ginancm
 */

import cardumen2d.Pez;
import cardumen2d.PezCardumen;
import java.util.ArrayList;

public class Cardumen {
    
    private double[][] oceano, oceanoAnterior;
    private boolean[][] ocupado;
    private ArrayList<PezCardumen> peces;
    private int width, height;
    
    public Cardumen(int Width, int Height, ArrayList<PezCardumen> pecesitos){
        
        width = Width;
        height = Height;
        
        oceano=new double[Width][Height];
        ocupado = new boolean [Width][Height];
        peces= pecesitos;
    }
    
    //Objetivo: Reiniciar tablero del oceano, antes saca una copia
    public void refrescarOceano(){
        /*TODO: Añadir manejo de memoria
         */        
        for(int i=0; i<width; i++){
            for(int j=0; j<height; j++){
                oceano[i][j]=0.0;
                ocupado[i][j]=false;
            }
        }
    }
    
   //Objetivo: actualizar tablero de presion del oceano
    public void actualizarOceano(){
        PezCardumen p1;
        int x, y;
        int xizq, xder, yarriba, yabajo;
        for(int p=0; p<peces.size(); p++){
            p1=peces.get(p);
            x=p1.getX_pez();
            y=p1.getY_pez();
            
            while(ocupado[x][y]){
                p1.moverPez(1);
                x=p1.getX_pez();
                y=p1.getY_pez();
            }
            ocupado[x][y] = true;
            
            xizq = x-1;
            xder = x+1;
            yarriba = y-1;
            yabajo = y+1;
//            try{    
            if(xizq>=0 && yarriba>=0){
                setOceano(xizq, yarriba, getOceano(xizq, yarriba)+0.08);
            }
            if(yarriba>=0){
                setOceano(x, yarriba, getOceano(x, yarriba)+0.08);
            }
            if(xder<width && yarriba >=0){
                setOceano(xder, yarriba, getOceano(xder, yarriba)+0.08);
            }
            if(xder < width){
                setOceano(xder, y, getOceano(xder, y)+0.08);
            }
            if(xder < width && yabajo<height){
                setOceano(xder, yabajo, getOceano(xder, yabajo)+0.08);
            }
            if(yabajo < height){
                setOceano(x, yabajo, getOceano(x, yabajo)+0.08);
            }
            if(xizq>=0 && yabajo < height){
                setOceano(xizq, yabajo, getOceano(xizq, yabajo)+0.08);
            }
            if(xizq >= 0){
                setOceano(xizq, y, getOceano(xizq, y)+0.08);
            }

//            }catch(ArrayIndexOutOfBoundsException excp){
//                System.out.println("Xder:"+ xder);
//                System.out.println("Xiz:"+ xizq);
//                System.out.println("Yarriba: "+yarriba);
//                System.out.println("Yabajo: "+yabajo);
//                System.out.println("Width: "+width);
//                System.out.println("Height: "+height);
//            }
            setOceano(x, y, getOceano(x, y)+0.09);
        }
        
    }
    
    //Objetivo: Actualizar los datos del vecindario de cada pez
    public void actualizarVecindades(){
        PezCardumen p1;
        int x, y;
        int xizq, xder, yarriba, yabajo;
        for(int p=0; p<peces.size(); p++){
            p1=  peces.get(p);
            x=p1.getX_pez();
            y=p1.getY_pez();
            
            xizq = x-1;
            xder = x+1;
            yarriba = y-1;
            yabajo = y+1;
            
            if(xizq>=0 && yarriba>=0){
                p1.setVecindad(getOceano(xizq, yarriba), 0);
            }
            if(yarriba>=0){
                p1.setVecindad(getOceano(x, yarriba), 1);
            }
            if(xder<width && yarriba >=0){
                p1.setVecindad(getOceano(xder, yarriba), 2);
            }
            if(xder < width){
                p1.setVecindad(getOceano(xder, y), 3);
            }
            if(xder < width && yabajo<height){
                p1.setVecindad(getOceano(xder, yabajo), 4);
            }
            if(yabajo < height){
                p1.setVecindad(getOceano(x, yabajo), 5);
            }
            if(xizq>=0 && yabajo < height){
                p1.setVecindad(getOceano(xizq, yabajo), 6);
            }
            if(xizq >= 0){
                p1.setVecindad(getOceano(xizq, y), 7);
            }
        }
    }
    
    //Objetivo: realizar la transicion entre estados para cada pez
    public void cambiarEstados(){
        PezCardumen p;
        
        for(int i=0; i<peces.size(); i++){
            p=peces.get(i);
            p.determinarEstado();
        }
    }
    
    public void ejecutarEstados(){
        PezCardumen p;
        
        for(int i=0; i<peces.size(); i++){
            p=peces.get(i);
            p.ejecutarEstado();
        }
    }
    
    //Objetivo: Simular el movimiento de peces en el oceano
    public void iterarCardumen(){
        refrescarOceano();
        actualizarOceano();
        actualizarVecindades();
        cambiarEstados();
        ejecutarEstados();
    }

    public double getOceano(int x, int y) {
        return oceano[x][y];
    }

    public void setOceano(int x, int y, double p) {
        oceano[x][y]=p;
    }
    
    
}
